home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <sys/time.h>
- #include <math.h>
- #include "conv.h"
-
- /* --------- The following definitions change
- according to precision required -------- */
-
-
- #ifdef SINGLE /* complex single precision */
-
- typedef float this_variable;
- typedef float this_real;
- #define MAX_RECUR 17
- #define OPS_PER_ITER 2
-
- #define SIMPLE_FIR simple_sfir1d_
- #define ORNL_FIR ornl_sfir1d_
- #define MY_FIR sfir1d_
- #define MY_C_FIR sfir1d
-
- #define SIMPLE_IIR simple_siir1d_
- #define ORNL_IIR ornl_siir1d_
- #define MY_IIR siir1d_
- #define MY_C_IIR siir1d
-
- #define SIMPLE_COR simple_scor1d_
- #define MY_COR scor1d_
- #define MY_INIT sinit_
- #define TOLERANCE 1.e-3
- #define THIS_IS_REAL
- #endif
- #ifdef DOUBLE /* real double precision */
-
- typedef double this_variable;
- typedef double this_real;
-
- #define MAX_RECUR 17
- #define OPS_PER_ITER 2
-
- #define SIMPLE_FIR simple_dfir1d_
- #define ORNL_FIR ornl_dfir1d_
- #define MY_FIR dfir1d_
- #define MY_C_FIR dfir1d
-
- #define SIMPLE_IIR simple_diir1d_
- #define ORNL_IIR ornl_diir1d_
- #define MY_IIR diir1d_
- #define MY_C_IIR diir1d
-
- #define SIMPLE_COR simple_dcor1d_
- #define MY_COR dcor1d_
- #define MY_INIT dinit_
- #define TOLERANCE 1.e-7
- #define THIS_IS_REAL
-
- #endif
- #ifdef COMPLEX /* complex single precision */
-
- typedef complex this_variable;
- typedef float this_real;
-
- #define MAX_RECUR 17
- #define OPS_PER_ITER 8
-
- #define SIMPLE_FIR simple_cfir1d_
- #define ORNL_FIR ornl_cfir1d_
- #define MY_FIR cfir1d_
- #define MY_C_FIR cfir1d
-
- #define SIMPLE_IIR simple_ciir1d_
- #define ORNL_IIR ornl_ciir1d_
- #define MY_IIR ciir1d_
- #define MY_C_IIR ciir1d
-
- #define SIMPLE_COR simple_ccor1d_
- #define MY_COR ccor1d_
- #define MY_INIT cinit_
- #define TOLERANCE 1.e-3
- #define THIS_IS_COMPLEX
-
- #endif
- #ifdef ZOMPLEX /* complex double precision */
-
- typedef zomplex this_variable;
- typedef double this_real;
-
- #define MAX_RECUR 17
- #define OPS_PER_ITER 8
-
- #define SIMPLE_FIR simple_zfir1d_
- #define ORNL_FIR ornl_zfir1d_
- #define MY_FIR zfir1d_
- #define MY_C_FIR zfir1d
-
- #define SIMPLE_IIR simple_ziir1d_
- #define ORNL_IIR ornl_ziir1d_
- #define MY_IIR ziir1d_
- #define MY_C_IIR ziir1d
-
- #define SIMPLE_COR simple_zcor1d_
- #define MY_COR zcor1d_
- #define MY_INIT zinit_
- #define TOLERANCE 1.e-7
- #define THIS_IS_COMPLEX
-
- #endif
-
- /* ---------- The rest is the same ---------------- */
-
- void MY_FIR(), SIMPLE_FIR(), ORNL_FIR();
- void MY_IIR(), MY_C_IIR(), SIMPLE_IIR(), ORNL_IIR();
-
- #define MAX_VAL 3
- this_real my_val[MAX_VAL] = {0., -.33, 1.};
-
- #define MAX_SIZE 35
- #define DEFAULT_TRIALS 999
- #define MAX_INC 3
- #define MAX_TIMES 3
-
-
- #define ABS(a) ( ((a)>0) ? (a) : -(a))
- #define MAX(a,b) ( ((a) > (b)) ? (a) : (b))
- #define MIN(a,b) ( ((a) < (b)) ? (a) : (b))
-
- void (*simple_function)();
- void (*ornl_function)();
- void (*my_function)();
- void GetArguments();
-
- double check_this();
-
- int parallel;
- int is_random;
- int n_trials;
- int len = 4;
-
- int size, n_trials, n_times, nf, ng, nh;
- int incf, nf1, nf2, incg, ng1, ng2, inch, nh1, nh2;
- this_variable *vx, *vy, *vz, *vt, *vr;
- this_variable alpha, beta, one, zero;
- double t, x, y, z, u;
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- int i, j, k;
-
- /* ******************************************************* */
- GetArguments( argc, argv);
- /* ******************************************************* */
-
- for( ; n_trials > 0 ; n_trials --) {
-
- get_values();
-
- printf("%3dx( %2d,%3d,%3d | %2d,%3d,%3d | %2d,%3d,%3d <>",
- n_times, incf,nf1,nf, incg,ng1,ng, inch,nh1,nh);
- #ifdef THIS_IS_REAL
- printf(" %5.2f, %5.2f ):", alpha, beta);
- #endif
- #ifdef THIS_IS_COMPLEX
- printf(" [%5.2f,%5.2f], [%5.2f,%5.2f] ):",
- alpha.real, alpha.imag, beta.real, beta.imag);
- #endif
-
- fflush(stdout);
-
- do_it();
-
- printf("\n", x);
- }
- return(0);
- }
- do_it()
- {
- int i,j,ii, jj, k, max_size;
- int this_inc, that_inc, i1, i2, j1, j2, k1, k2, l1, l2;
- this_variable *this_vx, *this_vy, *this_vz, *this_vt, *this_vr;
-
- vx = (this_variable *)my_malloc(((nf+1)*MAX_INC) * sizeof( this_variable));
- vy = (this_variable *)my_malloc(((ng+1)*MAX_INC) * sizeof( this_variable));
- vr = (this_variable *)my_malloc(((ng+1)*MAX_INC) * sizeof( this_variable));
- vz = (this_variable *)my_malloc(((nh+1)*MAX_INC) * sizeof( this_variable));
- vt = (this_variable *)my_malloc(((nh+1)*MAX_INC) * sizeof( this_variable));
-
- if( (vx == (this_variable *)0) ||
- (vy == (this_variable *)0) ||
- (vr == (this_variable *)0) ||
- (vt == (this_variable *)0) ||
- (vz == (this_variable *)0)) {
- fprintf( stderr, "Malloc problem ... Exiting");
- exit( 0 );
- }
- i = (nf+1)*MAX_INC;
- i = MY_INIT( &i, vx);
- i = (ng+1)*MAX_INC;
- j = MY_INIT( &i, vy);
-
- max_size = (nh+1)*MAX_INC;
- /*
- * Checking against a simple FIR convolution
- */
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, max_size*sizeof(this_variable));
-
- for( ii = 0; ii < n_times ; ii ++)
- SIMPLE_FIR( &nf, &ng, vx, vy, vz);
-
- this_inc = 1;
- i1 = 0; i2 = nf;
- j1 = 0; j2 = ng;
- k1 = 0; k2 = i2+j2-1;
- for( ii = 0; ii < n_times ; ii ++)
- MY_FIR( vx,&this_inc,&i1,&i2,
- vy,&this_inc,&j1,&j2,
- vt,&this_inc,&k1,&k2,
- &one, &zero);
-
- t = check_this( vz, vt, max_size) ;
-
- /*
- * Checking against a in-place convolution with simple FIR convolution
- */
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, max_size*sizeof(this_variable));
- bcopy( vx, vt, (nf)*sizeof(this_variable));
-
- SIMPLE_FIR( &nf, &ng, vx, vy, vz);
-
- this_inc = 1;
- i1 = 0; i2 = nf;
- j1 = 0; j2 = ng;
- k1 = 0; k2 = i2+j2-1;
-
- MY_FIR( vt,&this_inc,&i1,&i2,
- vy,&this_inc,&j1,&j2,
- vt,&this_inc,&k1,&k2,
- &one, &zero);
-
- t = check_this( vz, vt, max_size) ;
-
- /*
- * Checking against a simple IIR convolution
- */
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, max_size*sizeof(this_variable));
-
- this_inc = 1;
- i1 = 0; i2 = nf;
- j1 = 0; j2 = ng;
- k1 = 0; k2 = nf;
- init_min_phase( j2, vr, this_inc);
-
- for( ii = 0; ii < n_times ; ii ++)
- SIMPLE_IIR( &nf, &j2, vx, vr, vz);
-
- for( ii = 0; ii < n_times ; ii ++)
- MY_IIR( vx,&this_inc,&i1,&i2,
- vr,&this_inc,&j1,&j2,
- vt,&this_inc,&k1,&k2);
-
- t = check_this( vz, vt, max_size) ;
- /*
- * Checking against a in-place convolution with simple IIR convolution
- */
- max_size = (nh+1)*MAX_INC;
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, (max_size)*sizeof(this_variable));
- bcopy( vx, vt, (nf)*sizeof(this_variable));
-
- this_inc = 1;
- i1 = 0; i2 = nf;
- j1 = 0; j2 = ng;
- k1 = 0; k2 = i2;
-
- init_min_phase( j2, vr, this_inc);
-
- SIMPLE_IIR( &i2, &j2, vx, vr, vz);
-
- MY_IIR( vt,&this_inc,&i1,&i2,
- vr,&this_inc,&j1,&j2,
- vt,&this_inc,&k1,&k2);
-
- t = check_this( vz, vt, max_size) ;
- /*
- * Checking FIR against IIR ... IIR*IIR = ident
- */
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, max_size*sizeof(this_variable));
-
- this_inc = 1;
- i1 = 0; i2 = MIN(nf, MAX_RECUR);
- j1 = 0; j2 = MIN(ng, MAX_RECUR);
- k1 = 0; k2 = MIN(nf, MAX_RECUR);
-
- init_min_phase( j2, vr, this_inc);
-
- MY_FIR( vt,&this_inc,&i1,&i2,
- vr,&this_inc,&j1,&j2,
- vt,&this_inc,&k1,&k2,
- &one, &zero);
-
- MY_IIR( vt,&this_inc,&k1,&k2,
- vr,&this_inc,&j1,&j2,
- vt,&this_inc,&k1,&k2);
-
- t = check_this( vz, vt, max_size) ;
- /*
- * Checking COR against a simple correlation
- */
- bcopy( vz, vt, (max_size)*sizeof(this_variable));
-
- for( ii = 0; ii < n_times ; ii ++)
- SIMPLE_COR( &nf, &ng, vx, vy, vz);
-
- this_inc = 1;
- i1 = 0; i2 = nf;
- j1 = 0; j2 = ng;
- k1 = i1-(j2-1); k2 = nf+ng-1;
- for( ii = 0; ii < n_times ; ii ++)
- MY_COR( vx,&this_inc,&i1,&i2,
- vy,&this_inc,&j1,&j2,
- vt,&this_inc,&k1,&k2);
-
- t = check_this( vz, vt, max_size) ;
- /*
- * Checking FIR against a simple correlation
- */
- bcopy( vz, vt, (max_size)*sizeof(this_variable));
-
- for( ii = 0; ii < n_times ; ii ++)
- SIMPLE_COR( &nf, &ng, vx, vy, vz);
-
- this_inc = 1;
- i1 = 0; i2 = nf;
- j1 = -(ng-1); j2 = ng;
- k1 = i1+j1; k2 = i2+j2-1;
- this_vy = vy + j2-1;
- that_inc = -1;
- for( ii = 0; ii < n_times ; ii ++)
- MY_FIR( vx,&this_inc,&i1,&i2,
- this_vy,&that_inc,&j1,&j2,
- vt,&this_inc,&k1,&k2,
- &one, &zero);
-
- t = check_this( vz, vt, max_size) ;
- /*
- * Checking FIR against a Fortran template
- */
- this_vx = ( incf < 0) ? (vx - incf * (nf - 1)) : vx;
- this_vy = ( incg < 0) ? (vy - incg * (ng - 1)) : vy;
- this_vr = ( incg < 0) ? (vr - incg * (ng - 1)) : vr;
- this_vz = ( inch < 0) ? (vz - inch * (nh - 1)) : vz;
- this_vt = ( inch < 0) ? (vt - inch * (nh - 1)) : vt;
-
- i1 = nf1; i2 = nf;
- j1 = ng1; j2 = ng;
- k1 = nh1; k2 = nh;
-
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, max_size * sizeof(this_variable));
-
- for( ii = 0; ii < n_times ; ii ++)
- ORNL_FIR( this_vx,&incf,&i1,&i2,
- this_vy,&incg,&j1,&j2,
- this_vz,&inch,&k1,&k2,
- &alpha, &beta);
-
- for( ii = 0; ii < n_times ; ii ++)
- MY_FIR( this_vx,&incf,&i1,&i2,
- this_vy,&incg,&j1,&j2,
- this_vt,&inch,&k1,&k2,
- &alpha, &beta);
-
- t = check_this( vz, vt, max_size) ;
- /*
- * Checking the C_FIR version against the Fortran template
- */
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, (max_size)*sizeof(this_variable));
-
- for( ii = 0; ii < n_times ; ii ++)
- ORNL_FIR( this_vx,&incf,&i1,&i2,
- this_vy,&incg,&j1,&j2,
- this_vz,&inch,&k1,&k2,
- &alpha, &beta);
-
- for( ii = 0; ii < n_times ; ii ++)
- MY_C_FIR( this_vx,incf,i1,i2,
- this_vy,incg,j1,j2,
- this_vt,inch,k1,k2,
- #ifdef THIS_IS_REAL
- alpha, beta);
- #endif
- #ifdef THIS_IS_COMPLEX
- &alpha, &beta);
- #endif
-
- t = check_this( vz, vt, max_size) ;
- /*
- * Checking the IIR against the Fortran template
- */
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, (max_size)*sizeof(this_variable));
-
- init_min_phase( j2, this_vr, incg);
-
- ORNL_IIR( this_vx,&incf,&i1,&i2,
- this_vr,&incg,&j1,&j2,
- this_vt,&inch,&k1,&k2);
-
- MY_IIR( this_vx,&incf,&i1,&i2,
- this_vr,&incg,&j1,&j2,
- this_vz,&inch,&k1,&k2);
-
- t = check_this( vz, vt, max_size) ;
- /*
- * Checking the C_IIR against the Fortran template
- */
- MY_INIT( &max_size, vz);
- bcopy( vz, vt, (max_size)*sizeof(this_variable));
-
- ORNL_IIR( this_vx,&incf,&i1,&i2,
- this_vr,&incg,&j1,&j2,
- this_vt,&inch,&k1,&k2);
-
- MY_C_IIR( this_vx,incf,i1,i2,
- this_vr,incg,j1,j2,
- this_vz,inch,k1,k2);
-
- t = check_this( vz, vt, max_size) ;
- /*
- *
- */
- my_free ( vt);
- my_free ( vz);
- my_free ( vr);
- my_free ( vy);
- my_free ( vx);
- }
-
- void GetArguments( argc, argv)
- int argc;
- char *argv[];
- {
- int i, j, k;
- int nerror = 0;
-
- #define ON 1
-
- parallel = 0;
- is_random = 1;
- n_trials = DEFAULT_TRIALS;
-
- /* ******************************************************* */
- for ( i = 1 ; (i < argc) && (nerror != ON) ; i ++ ) {
- if( argv[i][0] == '-') {
- switch ( argv[i][1]) {
-
- case 'i' :
- case 'I' :
- is_random = 0;
- break;
- default : nerror = ON;
- }
- }
- else {
- if( i+1 > argc)
- nerror = ON;
- else {
- n_trials = atoi( argv[i]);
- }
- }
- }
- if( nerror == ON) {
- fprintf( stderr,
- "Usage : %s [-p(arallel)] [n_trials]\n", argv[0]);
- exit(0);
- }
- simple_function = SIMPLE_FIR;
- ornl_function = ORNL_FIR;
- my_function = MY_FIR;
-
- if( is_random)
- srandom( (123*getpid()) | 0x01);
- else
- srandom( 1);
- }
- get_values(){
- int jj;
- if( is_random) {
- nf = random() % MAX_SIZE + 1;
- ng = random() % MAX_SIZE + 1;
- nh = nf+ng+random() % MAX_SIZE;
-
- nf1 = random() % nf;
- nf2 = nf1 + random() % (nf - nf1);
- ng1 = random() % ng;
- ng2 = ng1 + random() % (ng - ng1);
- nh1 = nf1+ng1;
- nh2 = nh1 + random() % (nh - nh1);
-
- jj = random() % 23 - 11;
- nf1 -= jj; nf2 -= jj;
- jj = random() % 23 - 11;
- ng1 -= jj; ng2 -= jj;
- jj = random() % 23 - 11;
- nh1 += jj; nh2 += jj;
-
- incf = random() % (2 * MAX_INC) - MAX_INC;
- incg = random() % (2 * MAX_INC) - MAX_INC;
- inch = random() % (2 * MAX_INC) - MAX_INC;
-
- if(incf == 0) incf = 1;
- if(incg == 0) incg = 1;
- if(inch == 0) inch = 1;
-
- n_times = random() % MAX_TIMES + 1;
- #ifdef THIS_IS_REAL
- alpha = my_val[ random() % MAX_VAL];
- beta = my_val[ random() % MAX_VAL];
- #endif
- #ifdef THIS_IS_COMPLEX
- alpha.real = my_val[ random() % MAX_VAL];
- alpha.imag = my_val[ random() % MAX_VAL];
- beta.real = my_val[ random() % MAX_VAL];
- beta.imag = my_val[ random() % MAX_VAL];
- #endif
- }
- else {
- printf( "Enter sizex : ");
- scanf( "%d", &nf);
- printf( "Enter sizey : ");
- scanf( "%d", &ng);
- printf( "Enter sizez : ");
- scanf( "%d", &nh);
-
- n_times = 1;
-
- printf( "Enter x0 : ");
- scanf( "%d", &nf1);
- nf2 = nf1+nf-1;
-
- printf( "Enter y0 : ");
- scanf( "%d", &ng1);
- ng2 = ng1+ng-1;
-
- printf( "Enter z0 : ");
- scanf( "%d", &nh1);
- nh2 = nh1+nh-1;
-
- printf( "Enter incx : ");
- scanf( "%d", &incf);
- printf( "Enter incy : ");
- scanf( "%d", &incg);
- printf( "Enter incz : ");
- scanf( "%d", &inch);
-
- #ifdef THIS_IS_REAL
- alpha = .23;
- beta = -.41;
- #endif
- #ifdef THIS_IS_COMPLEX
- alpha.real = .22;
- alpha.imag = -.11;
- beta.real = -.22;
- beta.imag = .33;
- #endif
- }
- #ifdef THIS_IS_REAL
- one = 1.;
- zero = 0.;
- #endif
- #ifdef THIS_IS_COMPLEX
- one.real = 1.;
- one.imag = 0.;
- zero.real = 0.;
- zero.imag = 0.;
- #endif
-
- }
-
- double check_this( this_variable *a, this_variable *b, int n)
- {
- double max, av;
- int i, nerr=0;
- max = av = 0.0;
-
- #ifdef THIS_IS_REAL
- for (i = 0; i < n; i++){
- t = a[i] - b[i];
- t = t * t;
- if( t > max) max = t;
- t = a[i];
- av += t * t;
- }
- #endif
- #ifdef THIS_IS_COMPLEX
- for (i = 0; i < n; i++){
- t = a[i].real - b[i].real;
- z = a[i].imag - b[i].imag;
- t = t * t + z * z;
- if( t > max) max = t;
- t = a[i].real;
- z = a[i].imag;
- av += t * t + z * z;
- }
- #endif
- max = sqrt(max);
- av = sqrt( av / (double)n);
- if( av > 0.0) {
- max = max / av;
- }
- if( max > TOLERANCE) {
- fprintf(stderr, " Difference with reference is %.16e \n\n", max);
- max = TOLERANCE * av;
- max = max * max;
- for (i = 0; i < n; i++){
- #ifdef THIS_IS_REAL
- t = a[i] - b[i];
- t = t * t;
- #endif
- #ifdef THIS_IS_COMPLEX
- t = a[i].real - b[i].real;
- z = a[i].imag - b[i].imag;
- t = t * t + z * z;
- #endif
- if( t > max) {
- if( nerr < 10)
- fprintf(stderr, " %d", i);
- nerr++;
- }
- }
- fprintf( stderr, "\n %d Errors detected \n", nerr);
-
- exit(0);
- }
- else
- printf("-", t);
-
- fflush(stdout);
-
- return(max);
- }
- int init_min_phase( int ng, this_variable *vr, int inc)
- {
- #define MAX_ROOT .4
-
- this_variable duplet[2], *this, *that, *tmp;
- int i, ione=1, two = 2;
-
- this = (this_variable *) my_malloc( ng * sizeof(this_variable));
- that = (this_variable *) my_malloc( ng * sizeof(this_variable));
-
- #ifdef THIS_IS_REAL
- *duplet = 1.0;
- *this = 1.0;
- #endif
- #ifdef THIS_IS_COMPLEX
- (*duplet).real = 1.0;
- (*duplet).imag = 0.0;
- (*this).real = (*duplet).real;
- (*this).imag = (*duplet).imag;
- #endif
-
- for (i = 1; i < ng ; i++) {
- MY_INIT( &ione, duplet+1);
- /*
- printf(" %d %f \n", i, duplet[1]);
- */
- #ifdef THIS_IS_REAL
- duplet[1] *= MAX_ROOT;
- #endif
- #ifdef THIS_IS_COMPLEX
- duplet[1].real *= MAX_ROOT;
- duplet[1].imag *= MAX_ROOT;
- #endif
- SIMPLE_FIR( &i, &two, this, duplet, that);
-
- tmp = this;
- this = that;
- that = tmp;
- }
- for ( i = 0, tmp = vr; i < ng; i++, tmp += inc) {
- *tmp = this[i];
- }
- my_free( that);
- my_free (this);
- /*
- */
- #ifdef THIS_IS_REAL
- if( vr[0] != 1.) {
- #endif
- #ifdef THIS_IS_COMPLEX
- if( (vr->real != 1.) || (vr->imag != 0.) ) {
- #endif
- fprintf(stderr, "Error in First sample of Min_Phase filter \n");
- }
-
- #ifdef THIS_IS_REAL
- if( ABS(vr[(ng-1)*inc]) > 1.) {
- fprintf(stderr, "Error in Last sample of Min_Phase filter: %.16e \n", vr[ng-1]);
- }
- #endif
- #ifdef THIS_IS_COMPLEX
- if( (ABS(vr[(ng-1)*inc].real) > 1.) || (ABS(vr[(ng-1)*inc].imag) > 1.) ) {
- fprintf(stderr, "Error in Last sample of Min_Phase filter: (%.16e, %.16e) \n",
- vr[(ng-1)*inc].real, vr[(ng-1)*inc].imag);
- }
- #endif
- #ifdef THIS_IS_COMPLEX
- (*vr).imag = 0.5;
- #endif
-
- }
-